/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package comunicacaoCorba;

import comunicacao.ComunicacaoWeb;
import detalhepedido.DetalhePedido;
import fachada.Fachada;
import java.sql.Date;
import java.sql.SQLException;
import java.sql.Time;
import java.util.Properties;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import pedido.Pedido;
import produto.Produto;

/**
 *
 * @author Anderson
 */
class MainCorbaImpl extends MainCorbaPOA
{
    private ORB orb;

    public void setORB(ORB orb_val)
    {
        orb = orb_val;
    }


    public float consultarCredito(String cpf, String senha) {
        return 2;
    }

    public boolean solicitarCredito(String cpf, String numeroCartao, float valor) {
        return true;
    }

    public String realizarLogin(String login, String senha) {
        return ComunicacaoWeb.getComunicacaoWeb().realizarLogin(login, senha);
    }

    public String cadastrarCliente(String nome, String endereco, String numero, String complemento, String bairro, String cidade, String estado, String pais, String login, String senha, String telefone, String skype, String observacao) {
        return ComunicacaoWeb.getComunicacaoWeb().cadastrarCliente(nome, endereco, numero, complemento, bairro, cidade, estado, pais, login, senha, telefone, skype, observacao);
    }

    public String removerCliente(String id, String nome, String endereco, String numero, String complemento, String bairro, String cidade, String estado, String pais, String login, String senha, String telefone, String skype, String observacao) {
        return ComunicacaoWeb.getComunicacaoWeb().removerCliente(id,nome, endereco, numero, complemento, bairro, cidade, estado, pais, login, senha, telefone, skype, observacao);
    }

    public String atualizarCliente(String id, String nome, String endereco, String numero, String complemento, String bairro, String cidade, String estado, String pais, String login, String senha, String telefone, String skype, String observacao) {
        return ComunicacaoWeb.getComunicacaoWeb().atualizarCliente(id, nome, endereco, numero, complemento, bairro, cidade, estado, pais, login, senha, telefone, skype, observacao);
    }

    public String procurarCliente(String id, String nome, String endereco, String numero, String complemento, String bairro, String cidade, String estado, String pais, String login, String senha, String telefone, String skype, String observacao) {
        return ComunicacaoWeb.getComunicacaoWeb().procurarCliente(id, nome, endereco, numero, complemento, bairro, cidade, estado, pais, login, senha, telefone, skype, observacao);
    }

    public String efetuarPedido(int idCliente, float valorTotal, String data, String hora, int formaPgto, String produtos) {
        return ComunicacaoWeb.getComunicacaoWeb().efetuarPedido(idCliente, valorTotal, data, hora, formaPgto, produtos);
    }

    public String procurarProdutos(String id, String nome, String descricao, String preco, String qtd, String garantia, String altura, String largura, String profundidade, String disponibilidade, String subcategoria, String peso) {
        return ComunicacaoWeb.getComunicacaoWeb().procurarProdutos(id, nome, descricao, preco, qtd, garantia, altura, largura, profundidade, disponibilidade, subcategoria, peso);
    }

    public String buscarFormasPgto(int id, String descricao) {
        return ComunicacaoWeb.getComunicacaoWeb().buscarFormasPgto(id, descricao);
    }

    public void shutdown() {
        orb.shutdown(false);
    }

    public String getProdutos(int idPedido, int idCliente, double valor, int idEstadoPedido, String dataPedido, String horaPedido) {
        try {
            Pedido pedidoCriterio = new Pedido();
            Produto produtoCriterio =  new Produto();
            DetalhePedido detalhePedido = new DetalhePedido();
            Vector<Produto> produtos, todosProdutos;
            Vector<Pedido> pedidos;
            todosProdutos = new Vector<Produto>();
            if (idPedido != -1) {
                pedidoCriterio.setId(idPedido);
            }
            if (idCliente != -1) {
                pedidoCriterio.setCliente(idPedido);
            }
            if (idEstadoPedido != -1) {
                pedidoCriterio.setEstado(idEstadoPedido);
            }
            if (!dataPedido.equals("")) {
                pedidoCriterio.setData(Date.valueOf(dataPedido));
            }
            if (!horaPedido.equals("")) {
                pedidoCriterio.setHora(Time.valueOf(horaPedido));
            }

            pedidos = Fachada.getFachada().procurarLista(pedidoCriterio);
            Vector<DetalhePedido> detalhesPedidos;
            for(int i = 0; i < pedidos.size(); i++)
            {
                System.out.println("id do pedido "+ i+ ": "+pedidos.elementAt(i).getId());
                detalhePedido.setPedido(pedidos.elementAt(i).getId());

                detalhesPedidos = Fachada.getFachada().procurarLista(detalhePedido);
                for(int i2 = 0; i2 < detalhesPedidos.size() ; i2++)
                {
                    System.out.println("id do produto " + i2+": "+ detalhesPedidos.elementAt(i2).getProduto());
                    produtoCriterio.setId(detalhesPedidos.elementAt(i2).getProduto());
                    produtos = Fachada.getFachada().procurarLista(produtoCriterio);
                    for(int i3 = 0; i3 < produtos.size(); i3++)
                    {
                        System.out.println("id do produto " + i3 + ": " + produtos.get(i3));
                        if(!todosProdutos.contains(produtos.get(i3)))
                        {
                            System.out.println("incluindo em todosProdutos");
                            todosProdutos.add(produtos.get(i3));
                        }
                    }
                }
            }
            String resultado = "";
            for(int i = 0; i < todosProdutos.size(); i++)
            {
                resultado += todosProdutos.elementAt(i).toString() + ";";
            }
            resultado = resultado.substring(0, resultado.length()-1);

            return resultado;
        } catch (SQLException ex) {
            Logger.getLogger(MainCorbaImpl.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(MainCorbaImpl.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }
}
public class MainCorbaServer {
    public static void main(String args[])
    {
        Process p = null;
        try
        {
            p = Runtime.getRuntime().exec("orbd -ORBInitialPort 1050 -ORBInitialHost localhost");
            Properties props = new Properties();
            props.put("org.omg.CORBA.ORBInitialPort", "1050");
            props.put("org.omg.CORBA.ORBInitialHost", "localhost");
            ORB orb = ORB.init(args, props);
            //ORB orb = ORB.init(args, null);

            POA rootpoa = POAHelper.narrow(orb.resolve_initial_references("RootPOA"));
            rootpoa.the_POAManager().activate();

            MainCorbaImpl mainCorbaImpl = new MainCorbaImpl();
            mainCorbaImpl.setORB(orb);

            org.omg.CORBA.Object ref = rootpoa.servant_to_reference(mainCorbaImpl);
            MainCorba mref = MainCorbaHelper.narrow(ref);

            org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
            NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
            String name = "MainCorba";
            NameComponent path[] = ncRef.to_name(name);
            ncRef.rebind(path, mref);
            System.out.println("Servidor Main Corba pronto e esperando...");

            orb.run();
        }
        catch(Exception e)
        {
            System.err.println("Erro: " + e);
            e.printStackTrace(System.out);
        }

        System.out.println("Servidor Fechando");
        p.destroy();
    }
}
